#include <iostream>
#include <thread>
#include <mutex>

using namespace std;

/***
 * 二线程创建的其他方式
 *
 * 1、类
 *
 * 2.lambda表达式
 *
 * **/
// l类对象的方式
class TA
{
public:
    int &m_i;
    TA(int &i) : m_i(i)
    {
        std::cout << "constructor::" << std::endl;
        std::cout << "m_i::" << m_i << std::endl;
    }

    void operator()()
    {
        std::cout << "可调用对象" << std::endl;
    }

    TA(const TA &ta) : m_i(ta.m_i)
    {

        std::cout << "拷贝构造函数被执行" << std::endl;
    }
};

int main()
{

    //注意这里是局部变量，当局部变量传递到线程中，而线程与主线程分离，主线程先退出，
    //那么这个局部变量就会随着主线程退出，那么子线程无法使用这个局部变量
    //会产生无法预料的效果
    int m = 19;

    //注意：
    //不用担心这个对象局部变量会被销毁，实际上，这个ta对象局部变量会被赋值一份到线程中去
    //主线程结束，ta会被销毁，但是ta的复制到线程中的对象仍旧存在

    TA ta(m);
    thread t1(ta);

    // lambda方式
    auto mythread = []
    {
        std::cout << "thread execute" << std::endl;
    };
    thread t2(mythread);
    t1.join();
    t2.join();

    return 0;
}
